using System.Net;
using System.Threading.Tasks;

namespace Avalonia.WebView2.Maui;

/// <summary>
/// Represents a View that presents HTML content.
/// </summary>
public interface IWebView : IView
{
    /// <summary>
    /// Provide the data for a WebView.
    /// </summary>
    IWebViewSource Source { get; }

    /// <summary>
    /// When set this will act as a sync for cookies.
    /// </summary>
    CookieContainer Cookies { get; }

    /// <summary>
    /// Gets or sets the WebView's user agent string.
    /// </summary>
    string? UserAgent { get; set; }

    /// <summary>
    /// Gets a value that indicates whether the user can navigate to previous pages.
    /// </summary>
    bool CanGoBack { get; set; }

    /// <summary>
    /// Gets a value that indicates whether the user can navigate forward.
    /// </summary>
    bool CanGoForward { get; set; }

    /// <summary>
    /// Navigates to the previous page.
    /// </summary>
    void GoBack();

    /// <summary>
    /// Navigates to the next page in the list of visited pages.
    /// </summary>
    void GoForward();

    /// <summary>
    /// Reload the current content.
    /// </summary>
    void Reload();

    /// <summary>
    /// Evaluates the script that is specified by script.
    /// </summary>
    /// <param name="script">A script to evaluate.</param>
    void Eval(string script);

    /// <summary>
    /// On platforms that support JavaScript evaluation, evaluates script.
    /// </summary>
    /// <param name="script">The script to evaluate.</param>
    /// <returns>A task that contains the result of the evaluation as a string.</returns>
    Task<string> EvaluateJavaScriptAsync(string script);

    /// <summary>
    /// For internal use by the .NET MAUI platform.
    /// Raised after web navigation begins.
    /// </summary>
    bool Navigating(WebNavigationEvent evnt, string url);

    /// <summary>
    /// For internal use by the .NET MAUI platform.
    /// Raised after web navigation completes.
    /// </summary>
    void Navigated(WebNavigationEvent evnt, string url, WebNavigationResult result);

    /// <summary>
    /// For internal use by the .NET MAUI platform.
    /// Raised when a WebView process ends unexpectedly.
    /// </summary>
#if NETSTANDARD2_0
		void ProcessTerminated(WebProcessTerminatedEventArgs args);
#else
    void ProcessTerminated(WebProcessTerminatedEventArgs args) { }
#endif
}